﻿#ifndef EASYMSG_H
#define EASYMSG_H
#include "easymsgdefine.h"
#include "EasyMsgDispatcher.h"
#include "EasyMsgCallback.h"
#include "libeasymsg_global.h"

namespace EM{

class LIBEASYMSGSHARED_EXPORT EasyMsg
{
public:
    EasyMsg();
    virtual ~EasyMsg();
    virtual QString id() const = 0;
};
// 发布消息 此消息会被立即分发 函数将会在消息处理结束后返回
LIBEASYMSGSHARED_EXPORT void pushMsg(EasyMsg* msg);
// 发布消息 此消息会被传递到队列中 函数将会立即返回
LIBEASYMSGSHARED_EXPORT void postMsg(EasyMsg* msg);

template<typename _MSG_, typename _HostObj_, typename _Func_ >
void subscript(_Func_ func, _HostObj_* hostObj){
    EasyMsgImp::EasyMsgDispatcher::Instance()->addCallback(
                    MsgId<_MSG_>(), hostObj,
                    EasyMsgImp::EasyMsgCallback::CreateCallback(func,hostObj)
                );
}

template<typename _MSG_, typename _Func_>
void subscript(_Func_ func){
    EasyMsgImp::EasyMsgDispatcher::Instance()->addCallback(
                    MsgId<_MSG_>(),nullptr,
                    EasyMsgImp::EasyMsgCallback::CreateCallback(func)
                );
}

LIBEASYMSGSHARED_EXPORT void unsubscript(void * hostObj);
LIBEASYMSGSHARED_EXPORT void unsubscript(QString msgId, void* hostObj);

}
#endif // EASYMSG_H
